package com.lazily.houserent.view;


import com.lazily.houserent.domain.House;
import com.lazily.houserent.service.HouseService;
import com.lazily.houserent.utils.Utility;

/**
 * @Author: GZQ
 * @date: 2025/1/5 14:12
 * @description: 1. 显示界面
 * 2. 接收用户的输入
 * 3. 调用HouseService完成对房屋信息的各种操作
 */
public class HouseView {
	// 控制显示菜单
	private boolean loop = true;
	// 接收用户选择
	private char key = ' ';
	// 创建HouseService对象, 设置数组的大小为10
	private HouseService houseService = new HouseService(2);

	/**
	 * 根据id修改房屋信息
	 */
	public void update() {
		System.out.println("-----------------修改房屋信息-------------------");
		System.out.print("请输入要修改的房屋编号(-1退出): ");
		int updateId = Utility.readInt();
		if (updateId == -1) {
			System.out.println("放弃修改！");
			return;
		}

		// 根据输入的updateId, 查找对象
		// 注意：这里返回的是引用类型[即: 就是数组的元素]
		// 在后面对house.setXxx(), 就会修改HouseService 中 houses数组的元素 !!!!🔶🔶🔶
		House house = houseService.findById(updateId);
		if (house == null) {
			System.out.println("修改的房屋信息编号不存在");
			return;
		}

		System.out.print("姓名(" + house.getName() + ")：");
		String name = Utility.readString(8, ""); // 这里如果用户直接回车表示不修改该信息, 默认""
		if (!"".equals(name)) { // 修改
			house.setName(name);
		}

		System.out.print("电话(" + house.getPhone() + ")：");
		String phone = Utility.readString(12, "");
		if (!"".equals(phone)) {
			house.setPhone(phone);
		}

		System.out.print("地址(" + house.getAddress() + ")：");
		String address = Utility.readString(16, "");
		if (!"".equals(address)) {
			house.setAddress(address);
		}

		System.out.print("月租(" + house.getRent() + ")：");
		int rent = Utility.readInt(-1);
		if (rent != -1) {
			house.setRent(rent);
		}

		System.out.print("状态(" + house.getState() + ")：");
		String state = Utility.readString(3, "");
		if (!"".equals(state)) {
			house.setState(state);
		}
		System.out.println("修改成功！");
	}

	/**
	 * 根据地址查找, 接收地址, 调用Service 的findByaddress方法
	 * 有点小bug, 如果出现多个地址相同的房屋, 只显示第一个
	 */
	public void findHouseByAddress() {
		System.out.println("-----------------查询房屋信息-------------------");
		System.out.print("请输入要查询的地址: ");
		String address = Utility.readString(16);
		House house = houseService.findByAddress(address);
		if (house != null) {
			System.out.println(house);
		} else {
			System.out.println("没有找到该房屋信息！");
		}
	}


	/**
	 * 编写findHouse() 接收输入的id, 调用Service 的findById方法
	 */
	public void findHouse() {
		System.out.println("-----------------查询房屋信息-------------------");
		System.out.print("请输入你要查找的id: ");
		int findId = Utility.readInt();
		// 调用方法
		House house = houseService.findById(findId);
		if (house != null) {
			System.out.println(house);
		} else {
			System.out.println("没有找到该房屋信息！");
		}
	}

	/**
	 * 编写exit(), 完成退出确认
	 */
	public void exit() {
		// 这里我们使用Utility中的方法, 确认是否退出
		char c = Utility.readConfirmSelection();
		if (c == 'Y') {
			loop = false;
			System.out.println("谢谢你的使用！");
		}
	}

	/**
	 * 编写delHouse() 接收输入的id, 调用Service 的del方法
	 */
	public void delHouse() {
		System.out.println("-----------------删除房屋信息-------------------");
		System.out.print("请输入要删除的房屋编号(-1退出)：");
		int delId = Utility.readInt();
		if (delId == -1) {
			System.out.println("放弃删除！");
			return;
		}
		// 注意该方法本身就有循环判断的逻辑, 必须输入Y/N
		char choice = Utility.readConfirmSelection();
		if (choice == 'Y') { // 真的要删除
			if (houseService.del(delId)) {
				System.out.println("删除成功！");
			} else {
				System.out.println("删除失败！");
			}
		} else {
			System.out.println("放弃删除！");
		}
	}

	/**
	 * 编写addHouse() 接收输入, 创建House对象, 调用add方法
	 */
	public void addHouse() {
		System.out.println("-----------------添加房屋信息-------------------");
		System.out.print("姓名：");
		String name = Utility.readString(8);
		System.out.print("电话：");
		String phone = Utility.readString(12);
		System.out.print("地址：");
		String address = Utility.readString(16);
		System.out.print("月租：");
		int rent = Utility.readInt();
		System.out.print("状态：");
		String state = Utility.readString(3);
		// 创建一个新的House对象, 注意id 是系统分配的, 用户不能输入。
		House newHouse = new House(0, name, phone, address, rent, state);
		if (houseService.add(newHouse)) {
			System.out.println("添加成功！");
		} else {
			System.out.println("添加失败！");
		}
	}

	/**
	 * 编写listHouse() 显示房屋列表
	 */
	public void listHouses() {
		System.out.println("----------------房屋列表------------------");
		System.out.println("编号\t\t房主\t\t电话\t\t\t\t地址\t\t\t月租\t\t状态(未出租/已出租)");
		House[] houses = houseService.list(); // 得到所有房屋信息
		for (int i = 0; i < houses.length; i++) {
			// 如果为null, 就不用在显示了
			if (houses[i] == null) {
				break;
			}
			System.out.println(houses[i]);
		}
		System.out.println("----------------房屋信息显示完成----------------");
	}

	/**
	 * 显示主菜单
	 */
	public void mainMenu() {
		do {
			System.out.println("\n----------------房屋出租系统----------------");
			System.out.println("\t\t\t1 新 增 房 源");
			System.out.println("\t\t\t2 查 找 房 屋 信 息");
			System.out.println("\t\t\t3 删 除 房 屋 信 息");
			System.out.println("\t\t\t4 修 改 房 屋 信 息");
			System.out.println("\t\t\t5 显 示 房 屋 信 息");
			System.out.println("\t\t\t6 退 出 系 统");
			System.out.print("请输入你的选择(1-6): ");
			key = Utility.readChar();
			switch (key) {
				case '1':
					addHouse();
					break;
				case '2':
					findHouse();
					break;
				case '3':
					delHouse();
					break;
				case '4':
					update();
					break;
				case '5':
					listHouses();
					break;
				case '6':
					exit();
					break;
				default:
					System.out.println("输入有误，请重新输入");
			}
		} while (loop);
	}
}
